package io.gitee.macxiang.entity;

import org.springframework.http.HttpStatus;

import io.gitee.macxiang.utils.utils;
import lombok.Data;

/** API响应对象 */
@Data
public class ApiResponse {
  /** 请求唯一标识,由客户端发出,原样返回 */
  public String sid;
  /** 创建时间 */
  public long createTime = utils.time();
  /** 响应类型 */
  public String type;
  /** 响应数据 */
  public Object data;
  /** 响应消息 */
  public String message;
  /** 数据的MD5值 */
  public String md5;
  /** 响应状态码 */
  public int code = HttpStatus.BAD_REQUEST.value();

  /** 无参构造函数 */
  public ApiResponse() {
  }

  /** 克隆一个API响应对象
   * @param msg     响应消息对象
   */
  public ApiResponse(ApiResponse msg) {
    sid = msg.sid;
    type = msg.type;
    data = msg.data;
    message = msg.message;
    md5 = msg.md5;
    code = msg.code;
  }

  /** 根据响应消息创建一个API响应对象
   * @param message 响应消息
  */
  public ApiResponse(String message) {
    this.message = message;
  }

  /** 根据响应消息、响应类型创建一个API响应对象
   * @param message 响应消息
   * @param type    响应类型
   */
  public ApiResponse(String message, String type) {
    this.message = message;
    this.type = type;
  }

  /** 根据响应消息、响应状态码创建一个API响应对象
   * @param message 响应消息
   * @param code    响应状态码
   */
  public ApiResponse(String message, int code) {
    this.message = message;
    this.code = code;
  }

  /** 根据响应消息、响应类型、响应状态码创建一个API响应对象
   * @param message 响应消息
   * @param type    响应类型
   * @param code    响应状态码
  */
  public ApiResponse(String message, String type, int code) {
    this.message = message;
    this.type = type;
    this.code = code;
  }

  /** 根据响应数据创建一个API响应对象
   * @param data 响应数据
  */
  public ApiResponse(Object data) {
    this.data = data;
    this.code = 200;
  }

  /** 根据响应数据、响应消息创建一个API响应对象
   * @param data 响应数据
   * @param message 响应消息
  */
  public ApiResponse(Object data, String message) {
    this.data = data;
    this.message = message;
    this.code = 200;
  }

  /** 根据响应数据、响应消息、响应类型创建一个API响应对象
   * @param data 响应数据
   * @param message 响应消息
   * @param type 响应类型
  */
  public ApiResponse(Object data, String message, String type) {
    this.message = message;
    this.type = type;
    this.data = data;
    this.code = 200;
  }

  /** 根据响应数据、响应消息、响应状态码创建一个API响应对象
   * @param data    响应数据
   * @param message 响应消息
   * @param code    响应状态码
  */
  public ApiResponse(Object data, String message, int code) {
    this.message = message;
    this.data = data;
    this.code = code;
  }

  /** 根据响应数据、响应消息、响应状态码、响应类型创建一个API响应对象
   * @param data    响应数据
   * @param message 响应消息
   * @param type    响应类型
   * @param code    响应状态码
   */
  public ApiResponse(Object data, String message, String type, int code) {
    this.message = message;
    this.type = type;
    this.data = data;
    this.code = code;
  }

  /** 转化为String时以JSON格式输出 */
  public String toString() {
    return utils.toJString(this);
  }

  /** 创建一个成功响应
   * @param data    响应数据
   * @param message 响应消息
   * @return Api响应对象
   */
  public static ApiResponse success(Object data, String message) {
    return new ApiResponse(data, message, "success", 200);
  }

  /** 创建一个错误响应
   * @param message 响应消息
   * @return Api响应对象
   */
  public static ApiResponse err(String message) {
    return new ApiResponse(message, "error");
  }

}
